home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / autoupdate.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  4.1 KB  |  127 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. import prefs
  5. import config
  6. import dialogs
  7. import logging
  8. import eventloop
  9. import feedparser
  10. from httpclient import grabURL
  11. from gtcache import gettext as _
  12. delegate = None
  13. checkInProgress = False
  14.  
  15. def setDelegate(newDelegate):
  16.     global delegate
  17.     delegate = newDelegate
  18.  
  19.  
  20. def checkForUpdates(notifyIfUpToDate = False):
  21.     global checkInProgress
  22.     if not checkInProgress:
  23.         checkInProgress = True
  24.         logging.info('Checking for updates...')
  25.         url = config.get(prefs.AUTOUPDATE_URL)
  26.         
  27.         updateHandler = lambda data: _handleAppCast(data, notifyIfUpToDate)
  28.         errorHandler = _handleError
  29.         grabURL(url, updateHandler, errorHandler)
  30.     
  31.  
  32.  
  33. def _handleError(error):
  34.     global checkInProgress
  35.     checkInProgress = False
  36.     logging.warn('HTTP error while checking for updates')
  37.     eventloop.addTimeout(86400, checkForUpdates, 'Check for updates')
  38.  
  39.  
  40. def _handleAppCast(data, notifyIfUpToDate):
  41.     global checkInProgress
  42.     
  43.     try:
  44.         appcast = feedparser.parse(data['body'])
  45.         if appcast['bozo'] == '1':
  46.             return None
  47.         
  48.         upToDate = True
  49.         latest = _getItemForLatest(appcast)
  50.         if latest is not None:
  51.             serial = int(config.get(prefs.APP_SERIAL))
  52.             upToDate = serial >= _getItemSerial(latest)
  53.         
  54.         if not upToDate:
  55.             logging.info('New update available.')
  56.             if hasattr(delegate, 'handleNewUpdate'):
  57.                 delegate.handleNewUpdate(latest)
  58.             else:
  59.                 _handleNewUpdate(latest)
  60.         elif notifyIfUpToDate:
  61.             logging.info('Up to date. Notifying')
  62.             _handleUpToDate()
  63.         else:
  64.             logging.info('Up to date.')
  65.     except:
  66.         logging.warn('Error while handling appcast data.')
  67.         import traceback
  68.         traceback.print_exc()
  69.     finally:
  70.         checkInProgress = False
  71.         eventloop.addTimeout(86400, checkForUpdates, 'Check for updates')
  72.  
  73.  
  74.  
  75. def _getItemForLatest(appcast):
  76.     platform = config.get(prefs.APP_PLATFORM)
  77.     rejectedItems = list()
  78.     for item in appcast['entries']:
  79.         rejectedEnclosures = list()
  80.         for enclosure in item['enclosures']:
  81.             if enclosure['dtv:platform'] != platform:
  82.                 rejectedEnclosures.append(enclosure)
  83.                 continue
  84.         
  85.         for enclosure in rejectedEnclosures:
  86.             item['enclosures'].remove(enclosure)
  87.         
  88.         if len(item['enclosures']) == 0:
  89.             rejectedItems.append(item)
  90.             continue
  91.     
  92.     for item in rejectedItems:
  93.         appcast['entries'].remove(item)
  94.     
  95.     
  96.     try:
  97.         appcast['entries'].sort(key = _getItemSerial, reverse = True)
  98.         return appcast['entries'][0]
  99.     except:
  100.         return None
  101.  
  102.  
  103.  
  104. def _getItemSerial(item):
  105.     return int(item['enclosures'][0]['dtv:serial'])
  106.  
  107.  
  108. def _handleNewUpdate(item):
  109.     url = item['enclosures'][0]['href']
  110.     
  111.     def callback(dialog):
  112.         if dialog.choice == dialogs.BUTTON_DOWNLOAD:
  113.             delegate.openExternalURL(url)
  114.         
  115.  
  116.     summary = _('%s Version Alert') % (config.get(prefs.SHORT_APP_NAME),)
  117.     message = _('A new version of %s is available. Would you like to download it now?') % (config.get(prefs.LONG_APP_NAME),)
  118.     dlog = dialogs.ChoiceDialog(summary, message, dialogs.BUTTON_DOWNLOAD, dialogs.BUTTON_CANCEL)
  119.     dlog.run(callback)
  120.  
  121.  
  122. def _handleUpToDate():
  123.     title = _('%s Version Check') % (config.get(prefs.SHORT_APP_NAME),)
  124.     message = _('%s is up to date.') % (config.get(prefs.LONG_APP_NAME),)
  125.     dialogs.MessageBoxDialog(title, message).run()
  126.  
  127.